export class UrlTool {
  /**
   * 获取单个URL参数
   *
   * @param name URL参数名
   * @returns 参数值或undefined如果没有找到该参数
   */
  get(name: string): string {
    return this.getPara(name)
  }

  /**
   * 获取所有URL参数字符串
   * @returns 所有参数组成的查询字符串
   */
  getParas(): string {
    const url = location.href
    if (url.indexOf('?') === -1) {
      return ''
    }
    return url.substring(url.indexOf('?') + 1, url.length)
  }

  /**
   * 获取所有参数的对象
   * @returns 包含所有参数键值对的对象
   */
  getObj(): Record<string, string> {
    const paras = this.getParas()
    if (!paras) return {}

    const items = paras.split('&')
    const arr: Record<string, string> = {}
    for (let i = 0; i < items.length; i++) {
      const [key, value] = items[i].split('=')
      if (key) {
        arr[decodeURIComponent(key)] = value ? decodeURIComponent(value) : ''
      }
    }
    return arr
  }

  /**
   * 追加URL参数
   * @param url 原始URL
   * @param key 参数名
   * @param val 参数值
   * @returns 新的URL字符串
   */
  appendPara(url: string, key: string, val?: string): string {
    if (!val && val !== '') {
      return url
    }

    let separator = url.includes('?') ? '&' : '?'
    return `${url}${separator}${encodeURIComponent(key)}=${encodeURIComponent(val || '')}`
  }

  private getPara(name: string): string {
    const reg = new RegExp('(^|&)' + encodeURIComponent(name) + '=([^&]*)(&|$)')
    const r = window.location.search.substr(1).match(reg)
    if (r !== null) return decodeURIComponent(r[2])
    return ''
  }
}
